export const colors = {
    slate: '#cbd5e1',
    gray: '#d1d5db',
    zinc: '#d4d4d8',
    neutral: '#d4d4d4',
    stone: '#d6d3d1',
    red: '#fca5a5',
    orange: '#fdba74',
    amber: '#fcd34d',
    yellow: '#fde047',
    lime: '#bef264',
    green: '#86efac',
    emerald: '#6ee7b7',
    teal: '#5eead4',
    cyan: '#67e8f9',
    sky: '#7dd3fc',
    blue: '#93c5fd',
    indigo: '#a5b4fc',
    violet: '#c4b5fd',
    purple: '#d8b4fe',
    fuchsia: '#f0abfc',
    pink: '#f9a8d4',
    rose: '#fda4af',
}

export type Colors = keyof typeof colors

/**
 * 打印指定颜色文本
 * @param content 内容
 * @param colorName 颜色
 * @param bolder 是否加粗
 * @returns
 */
export function colorful(content: string, colorName: Colors | null = null, bolder = false): string {
    const colorStyle = colorName ? `color: ${colors[colorName]};` : ''
    const bolderStyle = bolder ? 'font-weight: bolder;' : ''

    return `<text style="${[colorStyle, bolderStyle].join(' ')}">${content}</text>`
}

/**
 * 生成控制台链接
 * @param content 要显示的内容
 * @param url 要跳转到的 url
 * @param newTab 是否在新标签页打开
 */
export function createLink(content: string, url: string, newTab = true) {
    return `<a href="${url}" target="${newTab ? '_blank' : '_self'}">${content}</a>`
}

/**
 * 给房间内添加跳转链接
 * @param roomName 添加调整链接的房间名
 * @returns 打印在控制台上后可以点击跳转的房间名
 */
export function createRoomLink(roomName: string) {
    return createLink(roomName, `https://screeps.com/a/#!/room/${Game.shard.name}/${roomName}`, false)
}

/**
 * 全局日志
 *
 * @param content 日志内容
 * @param prefixes 前缀中包含的内容
 * @param color 日志前缀颜色
 * @param notify 是否发送邮件
 */
export function log(content: string, prefixes: string[] = [], color: Colors | null = null, notify = false) {
    // 有前缀就组装在一起
    let prefix = prefixes.length > 0 ? `【${prefixes.join(' ')}】 ` : ''
    // 指定了颜色
    prefix = colorful(prefix, color, true)

    const logContent = `${prefix}${content}`
    console.log(logContent)
    // 转发到邮箱
    if (notify) Game.notify(logContent)

    return OK
}

/**
 * 全局日志
 * @param content 日志内容
 * @param instanceName 前缀中包含的内容，注意默认以及包含有房间名，其他前缀会和房间名结合
 * @param color 日志前缀颜色
 * @param notify 是否发送邮件
 */
export function roomLog(
    room: Room | string,
    content: string,
    instanceName = '',
    color: Colors | null = null,
    notify = false,
) {
    // 为房间名添加超链接
    const roomName = createRoomLink(typeof room === 'string' ? room : room.name)
    // 生成前缀并打印日志
    const prefixes = instanceName ? [roomName, instanceName] : [roomName]
    log(content, prefixes, color, notify)
}
